/*
 * @Author: tanjunyi@doctorwork.com
 * @Date: 2020-06-17 08:55:54
 * @LastEditors: tanjunyi@doctorwork.com
 * @LastEditTime: 2020-06-21 00:09:52
 * @Description:
 */

import { observe } from './observer/index';
export function initState(vm) {
	const opts = vm.$options;
	// vue 的数据来源 属性 方法 数据 计算方法 watch
	if (opts.props) {
		initProps(vm);
	}
	if (opts.methods) {
		initMethod(vm);
	}
	if (opts.data) {
		initData(vm);
	}
	if (opts.computed) {
		initComputed();
	}
	if (opts.watch) {
		initWatch(vm);
	}
}

function initProps(vm) {

}
function initMethod(vm) {

}
/**
 * 当访问this.name 的时候代理到vm._data.name
 * @param {*} target 
 * @param {*} property 
 * @param {*} key 
 */
function proxy(target, property, key) {
	Object.defineProperty(target, key, {
		get() {
			return target[property][key];
		},
		set(newValue) {
			target[property][key] = newValue;
		}
	})
}
function initData(vm) {
	let data = vm.$options.data;
	data = vm._data = typeof data === 'function' ? data.call(vm) : data;
	// 对象劫持 用户改变了数据， 希望得到通知
	Object.keys(data).forEach(key => {
		proxy(vm, '_data', key);
	})
	// Object.defineProperty() 给属性添加get和set方法
	observe(data); //响应式原理
}
function initComputed(vm) {

}
function initWatch(vm) {

}

